package com.neusoft.action;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;
import com.neusoft.bean.AdminInfoBean;
import com.neusoft.bean.AdminInfoBeanDTO;
import com.neusoft.bean.AdminInfoComponentBean;
import com.neusoft.service.IAdminInfoService;
import com.neusoft.utils.MyUtil;

/**
 * 控制层的响应类：通过注解@Controller表名这是一个控制层的类
 * 注意：Servlet框架是类级别的响应，使用类的注解@webServlet进行路径映射；
 * springmvc、struts2是方法级别的响应，使用方法的注解@RequestMapping进行路径映射
 * 
 * @author Administrator
 *
 */
// 映射路径就会变成： admin/...
@Controller
// @RequestMapping("admin")
public class AdminInfoAction {
	/*
	 * 注解方法：进行service层的实体bean的依赖注入
	 * 采用了面向接口的编程思想：在service层添加一个接口层，在调用service时，使用service接口类型的变量
	 */
	@Resource
	private IAdminInfoService adminS;
	@Resource
	HttpServletRequest request;
	// 模块级别的转换
	/*
	 * @InitBinder public void initBinder(WebDataBinder binder) {
	 * SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
	 * dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new
	 * CustomDateEditor(dateFormat, true)); //true:允许输入空值，false:不能为空值 }
	 */

	/**
	 * 管理员登录
	 * 
	 * @param adminB
	 * @return
	 */
	// action请求路径变为：admin/doAdminLogin
	@RequestMapping(value = "/doAdminLogin", method = { RequestMethod.GET, RequestMethod.POST }, params = { "uid=001" })
	public String doAdminLogin(AdminInfoBean adminB) {
		// 返回的视图路径名：剔除前缀和后缀
		// 全路径：/WEB-INF/views/login.jsp
		// 默认回到登录页面
		String strV = "../../login";
		// 打印登录信息
		System.out.println("登录用户名:" + adminB.getAdminname2() + "；密码：" + adminB.getAdminpsw());
		// 调用service层进行登录验证操作
		// 根据客户端浏览器输入的用户名和密码作为查询条件，在数据库中查询有没有该记录结果
		// List<AdminInfoBean> lstAdminB =
		// MyUtil.getNewInstance(AdminInfoService.class).doAdminLogin(adminB);
		List<AdminInfoBean> lstAdminB = adminS.doAdminLogin(adminB);
		// 如果登录验证成功，则进入登录成功页面
		if (lstAdminB != null && lstAdminB.size() > 0) {
			// 跳转到登录成功页面
			strV = "main";
		}
		return strV;
	}

	/**
	 * 管理员登录
	 * 
	 * @param adminB
	 * @return
	 */
	// action请求路径变为：admin/doAdminLogin
	@RequestMapping(value = "/doAdminLogin2", method = { RequestMethod.GET, RequestMethod.POST }, params = {
			"uid=001" })
	public String doAdminLogin2(@RequestParam(value = "adminname", defaultValue = "admin") String adminName,
			@RequestParam("adminpsw") String adminPsw) {
		// 返回的视图路径名：剔除前缀和后缀
		// 全路径：/WEB-INF/views/login.jsp
		// 默认回到登录页面
		String strV = "../../login";
		AdminInfoBean adminB = MyUtil.getNewInstance(AdminInfoBean.class);
		// 设置参数
		adminB.setAdminname2(adminName);
		adminB.setAdminpsw(adminPsw);
		// 打印登录信息
		System.out.println("登录用户名:" + adminB.getAdminname2() + "；密码：" + adminB.getAdminpsw());
		// 调用service层进行登录验证操作
		// 根据客户端浏览器输入的用户名和密码作为查询条件，在数据库中查询有没有该记录结果
		// List<AdminInfoBean> lstAdminB =
		// MyUtil.getNewInstance(AdminInfoService.class).doAdminLogin(adminB);
		List<AdminInfoBean> lstAdminB = adminS.doAdminLogin(adminB);
		// 如果登录验证成功，则进入登录成功页面
		if (lstAdminB != null && lstAdminB.size() > 0) {
			// 跳转到登录成功页面
			strV = "main";
		}
		return strV;
	}

	/**
	 * 管理员登录
	 * 
	 * @param adminB
	 * @return
	 */
	// action请求路径变为：admin/doAdminLogin
	@RequestMapping(value = "/doAdminLogin3", method = { RequestMethod.GET, RequestMethod.POST }, params = {
			"uid=001" })
	public String doAdminLogin3(AdminInfoComponentBean adminComB) {
		// 返回的视图路径名：剔除前缀和后缀
		// 全路径：/WEB-INF/views/login.jsp
		// 默认回到登录页面
		String strV = "../../login";
		// 打印登录信息
		System.out.println("登录用户名:" + adminComB.getLstAdmins().get(0).getAdminname2() + "；密码："
				+ adminComB.getLstAdmins().get(0).getAdminpsw());
		System.out.println("多选框的值：兴趣：" + Arrays.asList(adminComB.getAdminHobby()).toString());

		// 调用service层进行登录验证操作
		// 根据客户端浏览器输入的用户名和密码作为查询条件，在数据库中查询有没有该记录结果
		// List<AdminInfoBean> lstAdminB =
		// MyUtil.getNewInstance(AdminInfoService.class).doAdminLogin(adminB);
		List<AdminInfoBean> lstAdminB = adminS.doAdminLogin(adminComB.getLstAdmins().get(0));
		// 如果登录验证成功，则进入登录成功页面
		if (lstAdminB != null && lstAdminB.size() > 0) {
			// 跳转到登录成功页面
			strV = "main";
		}
		return strV;
	}

	/**
	 * 管理员信息添加
	 * 
	 * @param adminB
	 * @return
	 */
	@RequestMapping("/doAdminInfoAdd")
	public String doAdminInfoAdd(HttpServletRequest request, AdminInfoBean adminB) {
		// 调用service层进行数据保存业务逻辑处理
		adminS.saveOrUpdateAdminInfo(adminB);
		// 进行转发处理
		System.out.println("admininfo:" + adminB.toString());
		// 查询新增的数据信息，在结果页进行显示（倒序）
		// 调用service层获取所有的数据信息
		List<AdminInfoBean> lstAdmins = adminS.getAllAdminInfo(0);
		// 在跳转页面之前，将查询结果保存到session中
		request.getSession().setAttribute("lstAdmins", lstAdmins);
		// 保存成功,转到保存成功的页面
		return "adminInfo/AdminInfoAddDetail";
	}

	/**
	 * 管理员信息添加
	 * 
	 * @param adminB
	 * @return
	 */
	@RequestMapping("/doAdminInfoAddWithFileUpload")
	public String doAdminInfoAddWithFileUpload(@RequestParam("file_adminimg") MultipartFile uploadFile,
			AdminInfoBean adminB) {
		// 进行文件对象的文件上传处理
		MyUtil.uploadSingleFile(uploadFile, request, "adminImgs/", "adminImg_", adminB);

		// 调用service层进行数据保存业务逻辑处理
		adminS.saveOrUpdateAdminInfo(adminB);
		// 进行转发处理
		System.out.println("admininfo:" + adminB.toString());
		// 查询新增的数据信息，在结果页进行显示（倒序）
		// 调用service层获取所有的数据信息
		List<AdminInfoBean> lstAdmins = adminS.getAllAdminInfo(0);
		// 在跳转页面之前，将查询结果保存到session中
		request.getSession().setAttribute("lstAdmins", lstAdmins);
		// 保存成功,转到保存成功的页面
		return "adminInfo/AdminInfoAddDetail";
	}

	/**
	 * 管理员信息添加
	 * 
	 * @param adminB
	 * @return
	 */
	@RequestMapping("/doAdminInfoAdd2")
	public ModelAndView doAdminInfoAdd2(AdminInfoBean adminB) {
		// 创建一个用于返回的modelandview对象
		ModelAndView mav = new ModelAndView();
		// 调用service层进行数据保存业务逻辑处理
		// adminS.saveOrUpdateAdminInfo(adminB);
		// 进行转发处理
		System.out.println("admininfo:" + adminB.toString());
		// 查询新增的数据信息，在结果页进行显示（倒序）
		// 调用service层获取所有的数据信息
		List<AdminInfoBean> lstAdmins = adminS.getAllAdminInfo(0);
		// 在跳转页面之前，将查询结果保存到ModelAndView中进行缓存传值
		mav.addObject("lstAdmins", lstAdmins);
		// 设置返回的model的视图名
		mav.setViewName("adminInfo/AdminInfoAddDetail");
		// 保存成功,转到保存成功的页面
		return mav;
	}

	/**
	 * 管理员信息添加(重定向和转发处理)
	 * 
	 * @param adminB
	 * @return
	 */
	@RequestMapping("/doAdminInfoAdd3")
	public String doAdminInfoAdd3(AdminInfoBean adminB) {
		// 创建一个用于返回的modelandview对象
		ModelAndView mav = new ModelAndView();
		// 调用service层进行数据保存业务逻辑处理
		// adminS.saveOrUpdateAdminInfo(adminB);
		// 进行转发处理
		System.out.println("admininfo:" + adminB.toString());
		// 查询新增的数据信息，在结果页进行显示（倒序）
		// 保存成功,重定向到查询显示处理
		// return "redirect:doAdminInfoAdd2";
		return "forward:doAdminInfoAdd2";
	}

	/**
	 * 添加@ResponseBody注解：该方法会进行ajax响应，该方法只需要返回需要转换为josn的数据结构类型即可；
	 * springmvc框架会使用jackson插件将返回的数据结构转换为json字符串响应给客户端
	 * 
	 * @param adminB
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/ajaxQueryAdminInfo")
	public List<AdminInfoBean> ajaxQueryAdminInfo(AdminInfoBeanDTO adminB) {
		// 调用service方法进行数据库查询操作
		List<AdminInfoBean> lstAdmins = adminS.getAdminInfoByParas(adminB);
		return lstAdmins;
	}

	/**
	 * 使用response进行ajax处理
	 * 
	 * @param adminB
	 * @return
	 */
	@RequestMapping("/ajaxQueryAdminInfo2")
	public void ajaxQueryAdminInfo2(HttpServletResponse response, AdminInfoBeanDTO adminB) {
		try {
			// 调用service方法进行数据库查询操作
			List<AdminInfoBean> lstAdmins = adminS.getAdminInfoByParas(adminB);
			// 设置response的编码
			response.setCharacterEncoding("utf-8");
			// 获取response的writer对象
			PrintWriter pw = response.getWriter();
			// 将需要返回的数据结构转换为json字符串
			String strJeson = JSON.toJSONStringWithDateFormat(lstAdmins, "yyyy-MM-dd HH:mm:ss");
			// 返回给客户端
			pw.write(strJeson);
			pw.flush();
			pw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 管理员信息修改
	 * 
	 * @param uid
	 * @return
	 */
	@RequestMapping("/doAdminInfoModify")
	public String doAdminInfoModify(HttpServletRequest request, String uid) {
		// 调用service层进行数据保存业务逻辑处理
		// MyUtil.getNewInstance(AdminInfoService.class).saveAdminInfo(adminB);
		// 进行转发处理
		System.out.println("adminid:" + uid);
		// 查询新增的数据信息，在结果页进行显示（倒序）
		// 调用service层获取所有的数据信息
		AdminInfoBean adminB = adminS.selectByPrimaryKey(MyUtil.convertString2Integer(uid));
		// 在跳转页面之前，将查询结果保存到session中
		request.getSession().setAttribute("adminB", adminB);
		// 保存成功,转到保存成功的页面
		return "adminInfo/AdminInfoModify";
	}

	/**
	 * 管理员信息修改
	 * 
	 * @param uid
	 * @return
	 */
	@RequestMapping("/doAdminInfoDelete")
	public String doAdminInfoDelete(String uid) {
		// 调用service层进行数据保存业务逻辑处理
		// MyUtil.getNewInstance(AdminInfoService.class).saveAdminInfo(adminB);
		// 进行转发处理
		System.out.println("adminid:" + uid);
		// 查询新增的数据信息，在结果页进行显示（倒序）
		// 调用service层获取所有的数据信息
		int val = adminS.deleteByPrimaryKey(MyUtil.convertString2Integer(uid));
		// 保存成功,转到保存成功的页面
		return "adminInfo/adminInfoAjaxQuery";
	}
}
